import mysql, { format } from "mysql";
import { MYSQL as mysqlConfig } from "../config";
import logger from "../logger";
// 创建多个链接、复用与分发链接
const pool = mysql.createPool(mysqlConfig);

/**
 * 数据库查询封装
 *
 * 封装从数据库连接池获取连接并进行查询的功能
 * queryStr 中不要拼接参数值, 防止 sql 注入攻击
 *
 * @param {String} queryStr 查询语句
 * @param {Array} options 查询语句中需要替换占位符 ? 参数
 */
export const sqlQuery = async (queryStr, options = []) => {
  try {
    // 创建连接
    const connection = await new Promise((resolve, reject) => {
      pool.getConnection((error, connection) => {
        if (error) reject(error);
        resolve(connection);
      });
    });
    // 执行 sql 语句
    const result = await new Promise((resolve, reject) => {
      connection.query(queryStr, options, (error, result) => {
        if (error) reject(error);
        // 释放资源
        connection.release();
        resolve(result);
      });
    });
    // 返回结果
    return result;
  } catch (error) {
    logger.error(
      JSON.stringify({
        sql: format(queryStr, options),
        message: error.message,
      })
    );
    throw error;
  }
};
